<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <title>文档</title>
  <link href="../css/semantic/semantic.min.css" rel="stylesheet">
  <link href="../css/markdown.css" rel="stylesheet">
  <link href="../css/wtxynavigation.css" rel="stylesheet">
  <script src="../js/jquery.min.js"></script>
  <script type="text/javascript" src="../js/include.js"></script>
  <style>
    body{padding-top:0;background:#f7f7f7}
    body>.ui.container{width:100%;padding:0}
    #project-title{background:#6e6e6e;width:100%;line-height:3.572rem;color:#fff;font-size:1.2rem}
    #project-title .title-wrap{font-weight:700;padding:0 12px;width:100%;max-width:1366px!important;min-width:900px;margin:0 auto}
    #project-title .left,#project-title right{display:inline-block}
    #project-title .right{float:right}
    #project-title .right .wiki-actions .menu{left:auto;right:0;margin-top:.4em!important}
    #wiki-preview-container{width:100%;max-width:1366px!important;min-width:900px;padding:0;border:1px solid #e3e9ed;border-top:0}
    #wiki-preview>.ui.segment{margin-top:0;padding:1rem;padding-left:0;border:0}
    .hover-places{display:inline-block}
    #page-detail{width:60%;margin:0 auto}
    #page-detail .title{font-weight:700;font-size:24px;padding:12px 0;border-bottom:1px solid #ccc}
    #page-detail .content{margin-top:15px}
    .content p{word-wrap:break-word}
    #wiki-parent,#wiki-title,#wikis{display:none}
    .ui.grid{padding:0!important}
    #ex-all{cursor:pointer;color:#537c8d}
  </style>
</head>
<body>
  <div class="ui container">
    <div id="project-title">
      <div class="title-wrap">
        <div class="left">
          <i class="icon eye"></i>
          文档预览:
          mianmSDK
        </div>
        <div class="right">
          Export by Gitee
        </div>
      </div>
    </div>

    <div class="ui container" id="wiki-preview-container">
      <div id="wiki-preview">
        <div class="ui segment">
          <div id="page-detail" class="markdown-body">
            <div class='title'>26.runtime方法查找详解</div><div class='content'><h1>
<a id="26runtime方法查找详解" class="anchor" href="#26runtime%E6%96%B9%E6%B3%95%E6%9F%A5%E6%89%BE%E8%AF%A6%E8%A7%A3"></a>26.runtime方法查找详解?</h1>
<h1>
<a id="1-缓存查找-哈希查找" class="anchor" href="#1-%E7%BC%93%E5%AD%98%E6%9F%A5%E6%89%BE-%E5%93%88%E5%B8%8C%E6%9F%A5%E6%89%BE"></a>1. 缓存查找-哈希查找</h1>
<ul>
<li>给定值是<code>SEL</code>, 目标值就是对应的<code>bucket_t</code>中的<code>IMP</code>
</li>
<li>根据给定的方法选择器, 查找对应的方法实现</li>
</ul>
<p><strong>关键词</strong>:</p>
<h2>
<a id="11-过程" class="anchor" href="#11-%E8%BF%87%E7%A8%8B"></a>1.1 过程</h2>
<ol>
<li>首先根据给定方法选择器<code>SEL</code>通过一个函数映射出对应的<code>bucket_t</code>在哈希表中的位置</li>
<li>知道位置了就能拿到<strong>IMP</strong>函数指针,然后返回给调用方,执行函数.</li>
</ol>
<p><img src="images/runtimeCacheFind01.png" alt="runtimeCacheFind01"></p>
<p>上面的这个查找是哈希查找.伪代码如下:</p>
<p><strong>key</strong>和一个<strong>mask</strong>做<strong>按位与</strong>运算, 得到的一个结果就是, 给定<code>key</code>在哈希表中的索引位置.</p>
<p>知道位置了就能拿到<strong>IMP</strong>函数指针,然后返回给调用方,执行函数.</p>
<pre><code>
f(key) = key &amp; mask;

</code></pre>
<p><strong>mask</strong>也是<code>cache_t</code>数据结构里面的一个成员变量.</p>
<p><strong>使用哈希查找为了解决查找效率</strong></p>
<h1>
<a id="2-当前类中查找" class="anchor" href="#2-%E5%BD%93%E5%89%8D%E7%B1%BB%E4%B8%AD%E6%9F%A5%E6%89%BE"></a>2. 当前类中查找</h1>
<ul>
<li>对于<strong>已排序好</strong>的方法列表, 采用<strong>二分查找</strong>算法查找方法对应执行函数.</li>
<li>对于<strong>没有排序</strong>的方法列表, 采用<strong>一般遍历</strong>查找方法对应执行函数.</li>
</ul>
<h1>
<a id="3-父类逐级查找" class="anchor" href="#3-%E7%88%B6%E7%B1%BB%E9%80%90%E7%BA%A7%E6%9F%A5%E6%89%BE"></a>3. 父类逐级查找</h1>
<p><img src="images/runtimeCacheFind02.png" alt="runtimeCacheFind02"></p>
<p><img src="images/runtime2021051503.png" alt="runtime2021051503"></p></div>
          </div>
        </div>
      </div>
      </div>
  </div>
</body>
</html>